#pragma once

#include <cstdint>
#include <cstring>
#include <string>
#include <map>

namespace MessageFramework {

/**
 * @brief 统一消息协议头（类似HTTP Header）
 *
 * 包含所有协议层的元数据，独立于业务逻辑
 * 设计原则：固定结构、高效解析、协议可扩展
 */
struct MessageHeader {
    // ==================== 1. 身份标识 ====================
    char messageId[64];         ///< 消息唯一ID（UUID或timestamp-sequence）
    char messageType[32];       ///< 消息类型（TradeSignal、APIRequest、APIResponse等）
    char version[16];           ///< 协议版本（如 "1.0"）

    // ==================== 2. 路由信息 ====================
    char publisherId[32];       ///< 发布者ID（TraderManager、StrategyEngine、TraderAPI等）
    char consumerId[32];        ///< 消费者ID（可选，点对点消息时使用）
    char targetStream[64];      ///< 目标Redis Stream名称
    char replyStream[64];       ///< 响应Stream名称（请求-响应模式使用）

    // ==================== 3. 时间信息 ====================
    int64_t timestamp;          ///< 消息创建时间戳（纳秒）
    int64_t expiresAt;          ///< 消息过期时间（纳秒，0表示不过期）

    // ==================== 4. 安全信息 ====================
    char signature[128];        ///< HMAC-SHA256签名（hex编码）
    bool encrypted;             ///< 消息体是否加密
    char encryptionAlgo[16];    ///< 加密算法（AES-256-GCM）

    // ==================== 5. 追踪信息 ====================
    char traceId[64];           ///< 分布式追踪ID（用于关联相关消息）
    char parentId[64];          ///< 父消息ID（用于构建调用链）
    int priority;               ///< 优先级（0-9，数字越大优先级越高）

    // ==================== 6. 元数据 ====================
    int contentLength;          ///< 消息体长度（字节）
    char contentType[16];       ///< 内容类型（JSON、Binary等）

    /**
     * @brief 默认构造函数
     */
    MessageHeader() {
        std::memset(this, 0, sizeof(MessageHeader));
        std::strncpy(version, "1.0", sizeof(version) - 1);
        version[sizeof(version) - 1] = '\0';
        std::strncpy(contentType, "JSON", sizeof(contentType) - 1);
        contentType[sizeof(contentType) - 1] = '\0';
        priority = 5;  // 默认中等优先级
    }

    /**
     * @brief 序列化为字符串（用于签名和传输）
     */
    std::string serialize() const;

    /**
     * @brief 从字符串反序列化
     */
    static MessageHeader deserialize(const std::string& data);

    /**
     * @brief 转换为Redis XADD的字段映射
     */
    std::map<std::string, std::string> toRedisFields() const;

    /**
     * @brief 从Redis XREAD的字段映射构建
     */
    static MessageHeader fromRedisFields(const std::map<std::string, std::string>& fields);

    /**
     * @brief 生成唯一消息ID
     */
    static std::string generateMessageId();

    /**
     * @brief 生成追踪ID
     */
    static std::string generateTraceId();

    /**
     * @brief 验证消息是否过期
     */
    bool isExpired() const;

    /**
     * @brief 验证消息头的完整性
     */
    bool validate() const;
};

/**
 * @brief 完整消息结构（Header + Body）
 */
struct Message {
    MessageHeader header;       ///< 消息头（协议层）
    std::string body;           ///< 消息体（业务层，JSON或二进制）

    Message() = default;
    Message(const MessageHeader& h, const std::string& b)
        : header(h), body(b) {}
};

} // namespace MessageFramework
